/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package isistomarc21;

import static isistomarc21.IsisToMarc21.Indicadores;
import static isistomarc21.IsisToMarc21.Subcampos;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.marc4j.MarcStreamWriter;
import org.marc4j.MarcWriter;
import org.marc4j.marc.ControlField;
import org.marc4j.marc.DataField;
import org.marc4j.marc.MarcFactory;
import org.marc4j.marc.Record;

/**
 *
 * @author wilo
 */
public class IsisToMarc {

    public void TotalLoad(int from, int to, String outputFile, String path) {
        
        try {
        
        OutputStream out = null;

        int registrosCorrectos = 0;
        int campo7vacio = 0;
        int campo7diferente = 0;
        int contOp1 = 0;
        int contOp2 = 0;
        int contOp3 = 0;
        int contOp4 = 0;
        int contOp5 = 0;
        int contOp6 = 0;
        int contOp7 = 0;
        int contOp8 = 0;
        int campo5Correcto = 0;
        int campo5Incorrecto = 0;
        int campo5Total = 0;
        int campo41Correcto = 0;
        int campo41Incorrecto = 0;
        int campo41Total = 0;
        int campo500Correcto = 0;
        int campo500Incorrecto = 0;
        int campo500Total = 0;
        int campo3005Correcto = 0;
        int campo3006Correcto = 0;
        int campo3007Correcto = 0;
        int campo3017Correcto = 0;
        int campo3018Correcto = 0;
        
        //String mfn = "";
        String guardado = "";

        int conti = 0;
        String auxi = "";

        //Creamos el archivo .log
            File f = new File(outputFile+".log");
            FileWriter w;

            w = new FileWriter(f);
            BufferedWriter bw = new BufferedWriter(w);
            PrintWriter wr = new PrintWriter(bw);
            wr.write("Log "+outputFile+"\n");//escribimos en el archivo

        int conTotalReg = 0;
        ////////////////////
        try {
            //Creacion de las variables con sus valores por defecto
            String leader = "";
            String estado_registro = "n"; //caracter 5 del leader 
            String tipo_registro = "a";   //caracter 6 del leader
            String nivel_bibliografico = "b"; //caracter 7 del leader
            String nivel_codificacion = " ";  //caracter 17 del leader
            String forma_catalogacion = "a";  //caracter 18 del leader
            boolean bleader = false;

            boolean bandera = true;
            char indicador1 = ' ';
            char indicador2 = ' ';
            char[] indicadores = new char[2];
            MarcFactory factory = MarcFactory.newInstance();
            Record record = null;
            DataField datafield = null;
            
            //Creación de un archivo .mrc con Formato ISO
            File file = new File(outputFile + ".mrc");
            out = new FileOutputStream(file, true);
            MarcWriter writer = new MarcStreamWriter(out);

            String[] split;
            try {
                Process p = Runtime.getRuntime().exec("cmd /c wwwisis db=marc from=" + from + " to=" + to + " pft=@" + path);
                wr.append("cmd /c wwwisis db=marc from=" + from + " to=" + to + " pft=@" + path+"\n");
                BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()));
                String line = null;

                String campoText = "";
                String[] subcampo = null;
                boolean primerIndicador = false;
                boolean segundoIndicador = false;
                String[] subcampos2;

                while ((line = in.readLine()) != null) {
                    split = line.split("__");
                    auxi = auxi + line;

                    if (split.length > 1) {
                        //Ejemplo: 
                        //#653_  ^aCIRCO  ^aDOMADOR
                        //System.out.println(line);

                        //Se muestra el número de campo: 
                        //653
                        campoText = split[0].substring(3, split[0].length());
                       // System.out.println("campo: "+campoText);

                        int campo = Integer.parseInt(campoText);
                        if (campo < 3000 && bleader == false) {
                            //   System.out.println("Crea el leader");
                            leader = "00000" + estado_registro + tipo_registro + nivel_bibliografico + "  2200000" + nivel_codificacion + forma_catalogacion + " 4500";
                            estado_registro = "n";
                            tipo_registro = "a"; // OJOOOOOOOOOOOOOOOO
                            nivel_bibliografico = "b";

                            nivel_codificacion = " ";
                            forma_catalogacion = "a";
                            record = factory.newRecord(leader);
                            // System.out.println(leader);
                            bleader = true;
                        }
                        //Si tiene el campo ^:
                        //  ^aCIRCO  ^aDOMADOR

                        if (split[1].length() > 1) {
                            switch (campo) {
                                case 1: {
                                    ControlField control = factory.newControlField("001", split[1]);
                                    record.addVariableField(control);
                                    
                                    //mfn = split[1];
                                    guardado = split[0] + " " + split[1];
                                        
                                    break;
                                }
                                case 5: {
                                    if (split[1].substring(0, 1).compareTo("^") != 0) {
                                        if (split[1].substring(0, 1).compareTo("c") == 0 || split[1].substring(0, 1).compareTo("n") == 0) {
                                            split[1] = split[1].substring(1);
                                            campo5Incorrecto++;
                                        } else {
                                            campo5Correcto++;
                                        }
                                    } else {
                                        //       System.out.println("  -1er Indicador : Vacio\n  -2do Indicador : Vacio");
                                        //Subcampos(split[1],datafield,factory);
                                        split[1] = split[1].substring(2); // Eliminamos los caracteres ^a
                                        campo5Correcto++;
                                    }
                                    ControlField control = factory.newControlField("005", split[1]);
                                    record.addVariableField(control);
                                    campo5Total++;
                                    break;
                                }
                                case 41: {
                                    boolean c_datafiel = true;
                                    if (split[1].substring(0, 1).compareTo("^") != 0) {
                                        indicadores = Indicadores(split[1]);
                                        indicador1 = indicadores[0];
                                        indicador2 = indicadores[1];
                                        datafield = factory.newDataField("041", indicador1, indicador2);
                                        Subcampos(split[1], datafield, factory);
                                        campo41Incorrecto++;
                                    } else {
                                        campo41Correcto++;
                                        //System.out.println("  -1er Indicador : Vacio\n  -2do Indicador : Vacio");
                                        primerIndicador = false;
                                        segundoIndicador = false;
                                        // Separo por el caracter: ^
                                        //1ro->"  "  
                                        //2do->"aCIRCO  "
                                        //3ro->"aDOMADOR"
                                        subcampo = split[1].split("\\^");
                                        int cont = 1;

                                        if (subcampo.length > 2) {

                                            bandera = false;
                                            while (cont < subcampo.length) {
                                                String subcampoAux = subcampo[cont].substring(0, 1);
                                                if (subcampoAux.compareTo("0") == 0 || subcampoAux.compareTo("1") == 0) {
                                                    //             System.out.println("  -1er Indicador : "+subcampo[cont].substring(1,subcampo[cont].length()));
                                                    primerIndicador = true;
                                                    indicador1 = subcampo[cont].substring(1, 2).charAt(0);
                                                } else if (subcampoAux.compareTo("7") == 0 || subcampoAux.compareTo("#") == 0) {
                                                    //           System.out.println("  -2do Indicador : "+subcampo[cont].substring(1,subcampo[cont].length()));
                                                    segundoIndicador = true;

                                                    indicador2 = subcampo[cont].substring(1, 2).charAt(0);
                                                } else {
                                                    if (c_datafiel == true) {
                                                        datafield = factory.newDataField("041" + "", indicador1, indicador2);
                                                        c_datafiel = false;
                                                    }
                                       //         System.out.println("    *Subcampo: "+subcampoAux+" : "+subcampo[cont].substring(1,subcampo[cont].length()));
                                                    //if(subcampo[cont].substring(1,subcampo[cont].length()))
                                                    datafield.addSubfield(factory.newSubfield(subcampoAux.charAt(0), subcampo[cont].substring(1, subcampo[cont].length())));

                                                }
                                                if (primerIndicador == false) {
                                                    //       System.out.println("  -1er Indicador : Vacio");
                                                    indicador1 = ' ';
                                                }
                                                if (segundoIndicador == false) {
                                                    //     System.out.println("  -2do Indicador : Vacio...");
                                                    indicador2 = ' ';
                                                }
                                                cont++;
                                            }
                                        } else {
                                            datafield = null;
                                        }
                                    }
                                    campo41Total++;
                                    break;
                                }
                                case 500: {
                                    if (split[1].substring(0, 1).compareTo("^") != 0) {
                                        campo500Incorrecto++;
                                        if (split[1].substring(0, 1).compareTo(" ") == 0 || split[1].substring(0, 1).compareTo("#") == 0) {
                                            indicadores = Indicadores(split[1]);
                                            indicador1 = indicadores[0];
                                            indicador2 = indicadores[1];
                                            datafield = factory.newDataField(campo + "", indicador1, indicador2);
                                            Subcampos(split[1], datafield, factory);
                                        } else {
                                            //ignoramos los datos de este campo
                                            //                             System.out.println("  -1er Indicador : Vacio\n  -2do Indicador : Vacio");
                                            //                           System.out.println("    *Valor  : "+split[1]);
                                            datafield = null;
                                        }
                                    } else {
                                        //                     System.out.println("  -1er Indicador : Vacio\n  -2do Indicador : Vacio");
                                        indicador1 = ' ';
                                        indicador2 = ' ';
                                        datafield = factory.newDataField(campo + "", indicador1, indicador2);
                                        Subcampos(split[1], datafield, factory);
                                        campo500Correcto++;
                                    }
                                    campo500Total++;

                                    break;
                                }
                                default: {
                                    if (split[1].substring(0, 1).compareTo("^") != 0) {
                                        indicadores = Indicadores(split[1]);
                                        indicador1 = indicadores[0];
                                        indicador2 = indicadores[1];
                                    } else {
                                        //                   System.out.println("  -1er Indicador : Vacio\n  -2do Indicador : Vacio");
                                        indicador1 = ' ';
                                        indicador2 = ' ';
                                    }
                                    if (campo < 100) {
                                        datafield = factory.newDataField("0" + campo + "", indicador1, indicador2);
                                    } else {
                                        datafield = factory.newDataField(campo + "", indicador1, indicador2);
                                    }
                                    //             System.out.println("DATAFIELD:"+ campo + indicador1+indicador2);
                                    Subcampos(split[1], datafield, factory);
                                    indicador1 = ' ';
                                    indicador2 = ' ';

                                    break;
                                }

                            }

                            if (campo != 5 && datafield != null) {
                                // && datafield.getSubfields().size()>0 
                                record.addVariableField(datafield);
                                //datafield=null;

                            } else {
                                bandera = true;
                            }

                        } else {
                            switch (campo) {
                                case 3005: {
                                    //System.out.println("  Valor : "+split[1]);
                                    estado_registro = split[1];
                                    campo3005Correcto++;
                                    break;
                                }
                                case 3006: {
                                    // System.out.println("  Valor : "+split[1]);
                                    tipo_registro = split[1];
                                    campo3006Correcto++;
                                    break;
                                }
                                case 3007: {
                                    //System.out.println("  Valor : "+split[1]);
                                    nivel_bibliografico = split[1];
                                    campo3007Correcto++;
                                    break;
                                }
                                case 3017: {
                                    //System.out.println("  Valor : "+split[1]);
                                    if (split[1].compareTo("#") == 0) {
                                        split[1] = " ";
                                    }
                                    nivel_codificacion = split[1];
                                    campo3017Correcto++;
                                    break;
                                }
                                case 3018: {
                                    //System.out.println("  Valor : "+split[1]);
                                    forma_catalogacion = split[1];
                                    campo3018Correcto++;
                                    break;
                                }
                            }
                        }
                    } else {
                        if (line.length() == 0) {
                            // System.out.println("....................................");
                            writer.write(record);
                            //System.out.println(record.getControlFields().get(0));
                            conTotalReg++;
                            bleader = false;
                            
                            wr.append("...Registro Procesado : Campo MFN: "+ guardado.split(" ")[1]+"\n"); //escribimos en el log
                            System.out.println("...."+ guardado);
                        } else {
                            //                          System.out.println(line);
                            //Pos del vector subcampos
                            //0->vacio
                            //1->30006
                            //2->30007
                            //3->7
                            //4->82
                            //5->362
                            //6->490
                            subcampos2 = line.split("###");
                            if (subcampos2.length > 2) {
                                if (subcampos2[1].length() < 6 && subcampos2[2].length() < 6) {
                                    registrosCorrectos++;
                                    if (subcampos2[3].length() < 3) {
                                        campo7vacio++;
                                    } else {
                                        if (subcampos2[3].length() > 4) {
                                            String camp7 = subcampos2[3].substring(4, subcampos2[3].length());
                                            /*
                                             if(camp7.substring(0, 1).compareTo("T")==0)
                                             {
                                             conti++;
                                             System.out.println("cad= "+auxi);
                                             auxi="";
                                             }*/
                                            switch (camp7) {
                                                case "S/ a/ as": {
                                                    if (subcampos2[5].substring(4, subcampos2[5].length()).length() > 2) {
                                                        tipo_registro = "s";
                                                        nivel_bibliografico = "b";
                                                    } else {
                                                        contOp3++;
                                                    }
                                                    break;
                                                }
                                                case "S/ m/ ms": {
                                                    if (subcampos2[5].substring(4, subcampos2[5].length()).length() > 2) {
                                                        tipo_registro = "s";
                                                        nivel_bibliografico = "m";
                                                    } else {
                                                        contOp4++;
                                                    }
                                                    break;
                                                }
                                                case "S/ s/ s": {
                                                    if (subcampos2[5].substring(4, subcampos2[5].length()).length() > 2) {
                                                        tipo_registro = "s";
                                                        nivel_bibliografico = "s";
                                                    } else {
                                                        contOp5++;
                                                    }
                                                    break;
                                                }
                                                case "M/ m/ mc": {
                                                    if (subcampos2[6].substring(4, subcampos2[6].length()).length() > 2) {
                                                        tipo_registro = "s";
                                                        nivel_bibliografico = "m";
                                                    } else {
                                                        contOp6++;
                                                    }
                                                    break;
                                                }
                                                case "M/ m/ m": {
                                                    if (subcampos2[6].substring(4, subcampos2[6].length()).length() > 2) {
                                                        tipo_registro = "a";
                                                        nivel_bibliografico = "b";
                                                    } else {
                                                        contOp8++;
                                                    }
                                                    break;
                                                }

                                                default: {
                                                    campo7diferente++;
                                                    //System.out.println("/////////////////////");
                                                    break;
                                                }
                                            }
                                        } else {
                                            contOp7++;
                                        }
                                    }
                                }
                                if (subcampos2[1].length() < 6 && subcampos2[2].length() > 5) {
                                    contOp1++;
                                }
                                if (subcampos2[1].length() > 5 && subcampos2[2].length() < 6) {
                                    contOp2++;
                                }
                            }
                        }
                    }

                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        } catch (FileNotFoundException ex) {
            Logger.getLogger(IsisToMarc21.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            try {
                out.close();
            } catch (IOException ex) {
                Logger.getLogger(IsisToMarc21.class.getName()).log(Level.SEVERE, null, ex);
            }

        }
        System.out.println("registrosCorrectos: " + registrosCorrectos);
        System.out.println("campo7vacio: " + campo7vacio);
        System.out.println("campo7diferente: " + campo7diferente);

        wr.append("registrosCorrectos: " + registrosCorrectos+"\n"+"campo 7 vacio: " + campo7vacio+"\n"+"campo 7 con patron diferente: " + campo7diferente+"\n"+"\n"); //escribimos en el log
        
        System.out.println("3006 vacio; contOp1: " + contOp1);
        System.out.println("3007 vacio; contOp2: " + contOp2);
        System.out.println("S/ a/ as; contOp3: " + contOp3);
        System.out.println("S/ m/ ms; contOp4: " + contOp4);
        System.out.println("S/ s/ s; contOp5: " + contOp5);
        System.out.println("M/ m/ mc; contOp6: " + contOp6);
        System.out.println("m/ m/ m; contOp8: " + contOp8);
        System.out.println("Diferente; contOp7: " + contOp7);
        
        wr.append("Campo 3006 vacio: " + contOp1+"\n"+"Campo 3007 vacio: " + contOp2+"\n");
        wr.append("\n Campos 3006 y 3007 procesados con patrones: "+"\n");
        wr.append("   S/ a/ as :" + contOp3+"\n");
        wr.append("   S/ m/ ms :" + contOp4+"\n");
        wr.append("   S/ s/ s  :" + contOp5+"\n");
        wr.append("   M/ m/ mc :" + contOp6+"\n");
        wr.append("   m/ m/ m  :" + contOp8+"\n");
        wr.append("   Patron diferente :" + contOp7+"\n"+"\n");

        System.out.println("5 correcto  : " + campo5Correcto);
        System.out.println("5 incorrecto: " + campo5Incorrecto);
        System.out.println("5 total     : " + campo5Total);

        wr.append("5 correcto  : " + campo5Correcto+"\n");
        wr.append("5 incorrecto: " + campo5Incorrecto+"\n");
        wr.append("5 total     : " + campo5Total+"\n"+"\n");
            
        System.out.println("41 correcto  : " + campo41Correcto);
        System.out.println("41 incorrecto: " + campo41Incorrecto);
        System.out.println("41 total     : " + campo41Total);

        wr.append("41 correcto  : " + campo41Correcto+"\n");
        wr.append("41 incorrecto: " + campo41Incorrecto+"\n");
        wr.append("41 total     : " + campo41Total+"\n"+"\n");

        System.out.println("500 correcto  : " + campo500Correcto);
        System.out.println("500 incorrecto: " + campo500Incorrecto);
        System.out.println("500 total     : " + campo500Total);

        wr.append("500 correcto  : " + campo500Correcto+"\n");
        wr.append("500 incorrecto: " + campo500Incorrecto+"\n");
        wr.append("500 total     : " + campo500Total+"\n"+"\n");
        
        System.out.println("campo3005Correcto  : " + campo3005Correcto);
        System.out.println("campo3006Correcto  : " + campo3006Correcto);
        System.out.println("campo3007Correcto  : " + campo3007Correcto);
        System.out.println("campo3017Correcto  : " + campo3017Correcto);
        System.out.println("campo3018Correcto  : " + campo3018Correcto);

        wr.append("campo3005Correcto  : " + campo3005Correcto+"\n");
        wr.append("campo3006Correcto  : " + campo3006Correcto+"\n");
        wr.append("campo3007Correcto  : " + campo3007Correcto+"\n");
        wr.append("campo3017Correcto  : " + campo3017Correcto+"\n");
        wr.append("campo3018Correcto  : " + campo3018Correcto+"\n"+"\n");
            
        System.out.println("conti  : " + conti);

        System.out.println("total  : " + conTotalReg);
        wr.append("Total de Registros : " + conTotalReg);
        
        wr.close();
        bw.close();
            
        } catch (IOException ex) {
            Logger.getLogger(IsisToMarc.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public void Update(int from, int to, String fechaUpdate, String fechaFin, String path, String outputFile) {
        try {
            OutputStream out = null;

            //int contadores aux
            int registrosCorrectos = 0;
            int campo7vacio = 0;
            int campo7diferente = 0;
            int contOp1 = 0;
            int contOp2 = 0;
            int contOp3 = 0;
            int contOp4 = 0;
            int contOp5 = 0;
            int contOp6 = 0;
            int contOp7 = 0;
            int contOp8 = 0;
            int campo5Correcto = 0;
            int campo5Incorrecto = 0;
            int campo5Total = 0;
            int campo41Correcto = 0;
            int campo41Incorrecto = 0;
            int campo41Total = 0;
            int campo500Correcto = 0;
            int campo500Incorrecto = 0;
            int campo500Total = 0;
            int campo3005Correcto = 0;
            int campo3006Correcto = 0;
            int campo3007Correcto = 0;
            int campo3017Correcto = 0;
            int campo3018Correcto = 0;
            int totalGuardado = 0;

            int errorFechaSinTratamiento = 0;

            int conti = 0;
            String auxi = "";
            //String fechaUpdate="2014/01/01";
            String fechaRegistro = "";
            String mfn = "";
            String guardado = "";

            //Creamos el archivo .log
            File f = new File(outputFile+".log");
            FileWriter w;

            w = new FileWriter(f);
            BufferedWriter bw = new BufferedWriter(w);
            PrintWriter wr = new PrintWriter(bw);
            wr.write("Log "+outputFile+"\n");//escribimos en el archivo

            ////////
            int conTotalReg = 0;

            try {
                //Creacion de las variables con sus valores por defecto
                String leader = "";
                String estado_registro = "n"; //caracter 5 del leader
                String tipo_registro = "a";   //caracter 6 del leader
                String nivel_bibliografico = "b"; //caracter 7 del leader
                String nivel_codificacion = " ";  //caracter 17 del leader
                String forma_catalogacion = "a";  //caracter 18 del leader
                boolean bleader = false;

                boolean bandera = true;
                char indicador1 = ' ';
                char indicador2 = ' ';
                char[] indicadores = new char[2];
                MarcFactory factory = MarcFactory.newInstance();
                Record record = null;
                DataField datafield = null;
                //Creación de un archivo .mrc con Formato ISO
                File file = new File(outputFile + ".mrc");
                out = new FileOutputStream(file, true);
                MarcWriter writer = new MarcStreamWriter(out);

                String[] split;
                try {
                    Process p = Runtime.getRuntime().exec("cmd /c wwwisis db=marc from=" + from + " to=" + to + " pft=@" + path);
                    //Process p = Runtime.getRuntime().exec("cmd /c wwwisis db=marc from="+from+" to="+to+" pft=@"+path);
                    wr.append("cmd /c wwwisis db=marc from=" + from + " to=" + to + " pft=@" + path+"\n");
                    BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()));
                    String line = null;

                    String campoText = "";
                    String[] subcampo = null;
                    boolean primerIndicador = false;
                    boolean segundoIndicador = false;
                    String[] subcampos2;
                    boolean conditional = true;

                    while ((line = in.readLine()) != null) {
                        split = line.split("__");
                        auxi = auxi + line;

                        if (split.length > 1) {
                            //Ejemplo:
                            //#653_  ^aCIRCO  ^aDOMADOR
                            //System.out.println(line);

                            //Se muestra el número de campo:
                            //653
                            campoText = split[0].substring(3, split[0].length());
                            // System.out.println("campo: "+campoText);

                            int campo = Integer.parseInt(campoText);
                            if (campo < 3000 && bleader == false) {
                                //   System.out.println("Crea el leader");
                                leader = "00000" + estado_registro + tipo_registro + nivel_bibliografico + "  2200000" + nivel_codificacion + forma_catalogacion + " 4500";
                                estado_registro = "n";
                                tipo_registro = "a"; // OJOOOOOOOOOOOOOOOO
                                nivel_bibliografico = "b";

                                nivel_codificacion = " ";
                                forma_catalogacion = "a";
                                record = factory.newRecord(leader);
                                // System.out.println(leader);
                                bleader = true;
                            }

                            //if campo es 005, comparamos la fecha de actualizacion con la del registro
                            if (campo == 5) {
                                if (split[1].substring(0, 1).compareTo("^") != 0) {
                                    if (split[1].substring(0, 1).compareTo("c") == 0 || split[1].substring(0, 1).compareTo("n") == 0) {
                                        split[1] = split[1].substring(1);
                                        campo5Incorrecto++;
                                    } else {
                                        campo5Correcto++;
                                    }
                                } else {
                                    split[1] = split[1].substring(2); // Eliminamos los caracteres ^a
                                    campo5Incorrecto++;
                                }
                                if (split[1].length() > 7 && split[1].substring(0, 1).matches("[0-9]*")) {
                                    fechaRegistro = split[1].substring(0, 4) + "/" + split[1].substring(4, 6) + "/" + split[1].substring(6, 8);

                                    SimpleDateFormat formateador = new SimpleDateFormat("yyyy/MM/dd");

                                    Date fechaRegistroD = null;
                                    Date fechaUpdateD = null;
                                    Date fechaFinD = null;
                                    try {
                                        fechaRegistroD = formateador.parse(fechaRegistro);
                                        fechaUpdateD = formateador.parse(fechaUpdate);
                                        fechaFinD = formateador.parse(fechaFin);

                                        int ymk = 0;
                                        if (fechaUpdateD.after(fechaRegistroD) || fechaFinD.before(fechaRegistroD)) {
                                            conditional = false;
                                            int conti2 = 0;
                                            while (conti2 < 25) {
                                                line = in.readLine();
                                                conti2++;
                                            }
                                        } else {
                                            ymk = 1;
                                        }

                                    } catch (ParseException ex) {
                                        Logger.getLogger(IsisToMarc21.class.getName()).log(Level.SEVERE, null, ex);
                                    } catch (Exception e) {
                                        System.out.println("-------> Error registro : " + e);
                                    }

                                } else {
                                    wr.append("line: Campo" + line + ". Valor: " + split[1]+"\n"+"\n"); //escribimos en el log
                                    System.out.println("line: Campo" + line + ". split[1]: " + split[1]);
                                    errorFechaSinTratamiento++;
                                }
                            }
                            //Si tiene el campo ^:
                            //  ^aCIRCO  ^aDOMADOR

                            if (split[1].length() > 1) {
                                switch (campo) {
                                    case 1: {
                                        ControlField control = factory.newControlField("001", split[1]);
                                        record.addVariableField(control);
                                        mfn = split[1];
                                        guardado = split[0] + " " + split[1];
                                        break;
                                    }
                                    case 5: {
                                        if (split[1].substring(0, 1).compareTo("^") != 0) {
                                            if (split[1].substring(0, 1).compareTo("c") == 0 || split[1].substring(0, 1).compareTo("n") == 0) {
                                                split[1] = split[1].substring(1);
                                                campo5Incorrecto++;
                                            } else {
                                                campo5Correcto++;
                                            }
                                        } else {
                                            split[1] = split[1].substring(2); // Eliminamos los caracteres ^a
                                            campo5Incorrecto++;
                                        }
                                        if (split[1].length() < 8) {
                                            System.out.println(mfn + " " + split[1]);
                                        } else {
                                            fechaRegistro = split[1].substring(0, 4) + "/" + split[1].substring(4, 6) + "/" + split[1].substring(6, 8);
                                            ControlField control = factory.newControlField("005", split[1]);
                                            record.addVariableField(control);
                                            campo5Total++;
                                        }
                                        break;
                                    }
                                    case 41: {
                                        boolean c_datafiel = true;
                                        if (split[1].substring(0, 1).compareTo("^") != 0) {
                                            indicadores = Indicadores(split[1]);
                                            indicador1 = indicadores[0];
                                            indicador2 = indicadores[1];
                                            datafield = factory.newDataField("041", indicador1, indicador2);
                                            Subcampos(split[1], datafield, factory);
                                            campo41Incorrecto++;
                                        } else {
                                            campo41Correcto++;
                                            //System.out.println("  -1er Indicador : Vacio\n  -2do Indicador : Vacio");
                                            primerIndicador = false;
                                            segundoIndicador = false;
                                            // Separo por el caracter: ^
                                            //1ro->"  "
                                            //2do->"aCIRCO  "
                                            //3ro->"aDOMADOR"
                                            subcampo = split[1].split("\\^");
                                            int cont = 1;

                                            if (subcampo.length > 2) {

                                                bandera = false;
                                                while (cont < subcampo.length) {
                                                    String subcampoAux = subcampo[cont].substring(0, 1);
                                                    if (subcampoAux.compareTo("0") == 0 || subcampoAux.compareTo("1") == 0) {
                                                        //             System.out.println("  -1er Indicador : "+subcampo[cont].substring(1,subcampo[cont].length()));
                                                        primerIndicador = true;
                                                        indicador1 = subcampo[cont].substring(1, 2).charAt(0);
                                                    } else if (subcampoAux.compareTo("7") == 0 || subcampoAux.compareTo("#") == 0) {
                                                        //           System.out.println("  -2do Indicador : "+subcampo[cont].substring(1,subcampo[cont].length()));
                                                        segundoIndicador = true;

                                                        indicador2 = subcampo[cont].substring(1, 2).charAt(0);
                                                    } else {
                                                        if (c_datafiel == true) {
                                                            datafield = factory.newDataField("041" + "", indicador1, indicador2);
                                                            c_datafiel = false;
                                                        }
                                                        //         System.out.println("    *Subcampo: "+subcampoAux+" : "+subcampo[cont].substring(1,subcampo[cont].length()));
                                                        //if(subcampo[cont].substring(1,subcampo[cont].length()))
                                                        datafield.addSubfield(factory.newSubfield(subcampoAux.charAt(0), subcampo[cont].substring(1, subcampo[cont].length())));

                                                    }
                                                    if (primerIndicador == false) {
                                                        //       System.out.println("  -1er Indicador : Vacio");
                                                        indicador1 = ' ';
                                                    }
                                                    if (segundoIndicador == false) {
                                                        //     System.out.println("  -2do Indicador : Vacio...");
                                                        indicador2 = ' ';
                                                    }
                                                    cont++;
                                                }
                                            } else {
                                                datafield = null;
                                            }
                                        }
                                        campo41Total++;
                                        break;
                                    }
                                    case 500: {
                                        if (split[1].substring(0, 1).compareTo("^") != 0) {
                                            campo500Incorrecto++;
                                            if (split[1].substring(0, 1).compareTo(" ") == 0 || split[1].substring(0, 1).compareTo("#") == 0) {
                                                indicadores = Indicadores(split[1]);
                                                indicador1 = indicadores[0];
                                                indicador2 = indicadores[1];
                                                datafield = factory.newDataField(campo + "", indicador1, indicador2);
                                                Subcampos(split[1], datafield, factory);
                                            } else {
                                                //ignoramos los datos de este campo
                                                //                             System.out.println("  -1er Indicador : Vacio\n  -2do Indicador : Vacio");
                                                //                           System.out.println("    *Valor  : "+split[1]);
                                                datafield = null;
                                            }
                                        } else {
                                            //                     System.out.println("  -1er Indicador : Vacio\n  -2do Indicador : Vacio");
                                            indicador1 = ' ';
                                            indicador2 = ' ';
                                            datafield = factory.newDataField(campo + "", indicador1, indicador2);
                                            Subcampos(split[1], datafield, factory);
                                            campo500Correcto++;
                                        }
                                        campo500Total++;

                                        break;
                                    }
                                    default: {
                                        if (split[1].substring(0, 1).compareTo("^") != 0) {
                                            indicadores = Indicadores(split[1]);
                                            indicador1 = indicadores[0];
                                            indicador2 = indicadores[1];
                                        } else {
                                            //                   System.out.println("  -1er Indicador : Vacio\n  -2do Indicador : Vacio");
                                            indicador1 = ' ';
                                            indicador2 = ' ';
                                        }
                                        if (campo < 100) {
                                            datafield = factory.newDataField("0" + campo + "", indicador1, indicador2);
                                        } else {
                                            datafield = factory.newDataField(campo + "", indicador1, indicador2);
                                        }
                                        //             System.out.println("DATAFIELD:"+ campo + indicador1+indicador2);
                                        Subcampos(split[1], datafield, factory);
                                        indicador1 = ' ';
                                        indicador2 = ' ';

                                        break;
                                    }

                                }

                                if (campo != 5 && datafield != null) {
                                    // && datafield.getSubfields().size()>0
                                    record.addVariableField(datafield);
                                    //datafield=null;

                                } else {
                                    bandera = true;
                                }

                            } else {
                                switch (campo) {
                                    case 3005: {
                                        //System.out.println("  Valor : "+split[1]);
                                        estado_registro = split[1];
                                        campo3005Correcto++;
                                        break;
                                    }
                                    case 3006: {
                                        // System.out.println("  Valor : "+split[1]);
                                        tipo_registro = split[1];
                                        campo3006Correcto++;
                                        break;
                                    }
                                    case 3007: {
                                        //System.out.println("  Valor : "+split[1]);
                                        nivel_bibliografico = split[1];
                                        campo3007Correcto++;
                                        break;
                                    }
                                    case 3017: {
                                        //System.out.println("  Valor : "+split[1]);
                                        if (split[1].compareTo("#") == 0) {
                                            split[1] = " ";
                                        }
                                        nivel_codificacion = split[1];
                                        campo3017Correcto++;
                                        break;
                                    }
                                    case 3018: {
                                        //System.out.println("  Valor : "+split[1]);
                                        forma_catalogacion = split[1];
                                        campo3018Correcto++;
                                        break;
                                    }
                                }
                            }
                        } else {
                            if (line.length() == 0) {
                                
                                 SimpleDateFormat formateador = new SimpleDateFormat("yyyy/MM/dd");
                                
                                 Date fechaRegistroD=null;
                                 Date fechaUpdateD=null;
                                 Date fechaFinD=null;
                                 try {
                                    fechaRegistroD = formateador.parse(fechaRegistro);
                                    fechaUpdateD = formateador.parse(fechaUpdate);
                                    fechaFinD = formateador.parse(fechaFin);


                                    if ( fechaUpdateD.before(fechaRegistroD) && fechaFinD.after(fechaRegistroD))
                                    {
                                       writer.write(record);
                                       conTotalReg++;
                                       totalGuardado++;
                                        
                                       wr.append("...Registro Procesado : Campo MFN: "+ guardado.split(" ")[1]+". Fecha Registro: "+fechaRegistro+"\n"); //escribimos en el log
                                       System.out.println("...."+ guardado+" fecha: "+fechaRegistro);
                                    }
                                 } catch (ParseException ex) {
                                    Logger.getLogger(IsisToMarc21.class.getName()).log(Level.SEVERE, null, ex);
                                    System.out.println("///////"+ fechaRegistro);
                                 }
                                
                                 

                                //System.out.println(record.getControlFields().get(0));
                                bleader = false;
                                conditional = true;
                            } else {
                                //                          System.out.println(line);
                                //Pos del vector subcampos
                                //0->vacio
                                //1->30006
                                //2->30007
                                //3->7
                                //4->82
                                //5->362
                                //6->490
                                subcampos2 = line.split("###");
                                if (subcampos2.length > 2) {
                                    if (subcampos2[1].length() < 6 && subcampos2[2].length() < 6) {
                                        registrosCorrectos++;
                                        if (subcampos2[3].length() < 3) {
                                            campo7vacio++;
                                        } else {
                                            if (subcampos2[3].length() > 4) {
                                                String camp7 = subcampos2[3].substring(4, subcampos2[3].length());
                                                /*
                                                 if(camp7.substring(0, 1).compareTo("T")==0)
                                                 {
                                                 conti++;
                                                 System.out.println("cad= "+auxi);
                                                 auxi="";
                                                 }*/
                                                switch (camp7) {
                                                    case "S/ a/ as": {
                                                        if (subcampos2[5].substring(4, subcampos2[5].length()).length() > 2) {
                                                            tipo_registro = "s";
                                                            nivel_bibliografico = "b";
                                                        } else {
                                                            contOp3++;
                                                        }
                                                        break;
                                                    }
                                                    case "S/ m/ ms": {
                                                        if (subcampos2[5].substring(4, subcampos2[5].length()).length() > 2) {
                                                            tipo_registro = "s";
                                                            nivel_bibliografico = "m";
                                                        } else {
                                                            contOp4++;
                                                        }
                                                        break;
                                                    }
                                                    case "S/ s/ s": {
                                                        if (subcampos2[5].substring(4, subcampos2[5].length()).length() > 2) {
                                                            tipo_registro = "s";
                                                            nivel_bibliografico = "s";
                                                        } else {
                                                            contOp5++;
                                                        }
                                                        break;
                                                    }
                                                    case "M/ m/ mc": {
                                                        if (subcampos2[6].substring(4, subcampos2[6].length()).length() > 2) {
                                                            tipo_registro = "s";
                                                            nivel_bibliografico = "m";
                                                        } else {
                                                            contOp6++;
                                                        }
                                                        break;
                                                    }
                                                    case "M/ m/ m": {
                                                        if (subcampos2[6].substring(4, subcampos2[6].length()).length() > 2) {
                                                            tipo_registro = "a";
                                                            nivel_bibliografico = "b";
                                                        } else {
                                                            contOp8++;
                                                        }
                                                        break;
                                                    }

                                                    default: {
                                                        campo7diferente++;
                                                        //System.out.println("/////////////////////");
                                                        break;
                                                    }
                                                }
                                            } else {
                                                contOp7++;
                                            }
                                        }
                                    }
                                    if (subcampos2[1].length() < 6 && subcampos2[2].length() > 5) {
                                        contOp1++;
                                    }
                                    if (subcampos2[1].length() > 5 && subcampos2[2].length() < 6) {
                                        contOp2++;
                                    }
                                }
                            }
                        }

                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            } catch (FileNotFoundException ex) {
                Logger.getLogger(IsisToMarc21.class.getName()).log(Level.SEVERE, null, ex);
            } finally {
                try {
                    out.close();
                } catch (IOException ex) {
                    Logger.getLogger(IsisToMarc21.class.getName()).log(Level.SEVERE, null, ex);
                }

            }
            System.out.println("registrosCorrectos: " + registrosCorrectos);
            System.out.println("campo7vacio: " + campo7vacio);
            System.out.println("campo7diferente: " + campo7diferente);
            
            wr.append("registrosCorrectos: " + registrosCorrectos+"\n"+"campo 7 vacio: " + campo7vacio+"\n"+"campo 7 con patron diferente: " + campo7diferente+"\n"+"\n"); //escribimos en el log

            System.out.println("3006 vacio; contOp1: " + contOp1);
            System.out.println("3007 vacio; contOp2: " + contOp2);
            System.out.println("S/ a/ as; contOp3: " + contOp3);
            System.out.println("S/ m/ ms; contOp4: " + contOp4);
            System.out.println("S/ s/ s; contOp5: " + contOp5);
            System.out.println("M/ m/ mc; contOp6: " + contOp6);
            System.out.println("m/ m/ m; contOp8: " + contOp8);
            System.out.println("Diferente; contOp7: " + contOp7);

            wr.append("Campo 3006 vacio: " + contOp1+"\n"+"Campo 3007 vacio: " + contOp2+"\n");
            wr.append("\n Campos 3006 y 3007 procesados con patrones: "+"\n");
            wr.append("   S/ a/ as :" + contOp3+"\n");
            wr.append("   S/ m/ ms :" + contOp4+"\n");
            wr.append("   S/ s/ s  :" + contOp5+"\n");
            wr.append("   M/ m/ mc :" + contOp6+"\n");
            wr.append("   m/ m/ m  :" + contOp8+"\n");
            wr.append("   Patron diferente :" + contOp7+"\n"+"\n");
            
            System.out.println("5 correcto  : " + campo5Correcto+"\n");
            System.out.println("5 incorrecto: " + campo5Incorrecto+"\n");
            System.out.println("5 total     : " + campo5Total+"\n");
            
            wr.append("5 correcto  : " + campo5Correcto+"\n");
            wr.append("5 incorrecto: " + campo5Incorrecto+"\n");
            wr.append("5 total     : " + campo5Total+"\n"+"\n");

            System.out.println("41 correcto  : " + campo41Correcto+"\n");
            System.out.println("41 incorrecto: " + campo41Incorrecto+"\n");
            System.out.println("41 total     : " + campo41Total+"\n"+"\n");
            
            wr.append("41 correcto  : " + campo41Correcto+"\n");
            wr.append("41 incorrecto: " + campo41Incorrecto+"\n");
            wr.append("41 total     : " + campo41Total+"\n"+"\n");

            System.out.println("500 correcto  : " + campo500Correcto);
            System.out.println("500 incorrecto: " + campo500Incorrecto);
            System.out.println("500 total     : " + campo500Total);

            wr.append("500 correcto  : " + campo500Correcto+"\n");
            wr.append("500 incorrecto: " + campo500Incorrecto+"\n");
            wr.append("500 total     : " + campo500Total+"\n"+"\n");
            
            System.out.println("campo3005Correcto  : " + campo3005Correcto);
            System.out.println("campo3006Correcto  : " + campo3006Correcto);
            System.out.println("campo3007Correcto  : " + campo3007Correcto);
            System.out.println("campo3017Correcto  : " + campo3017Correcto);
            System.out.println("campo3018Correcto  : " + campo3018Correcto);
            
            wr.append("campo3005Correcto  : " + campo3005Correcto+"\n");
            wr.append("campo3006Correcto  : " + campo3006Correcto+"\n");
            wr.append("campo3007Correcto  : " + campo3007Correcto+"\n");
            wr.append("campo3017Correcto  : " + campo3017Correcto+"\n");
            wr.append("campo3018Correcto  : " + campo3018Correcto+"\n"+"\n");

            System.out.println("conti  : " + conti);
            System.out.println("errorFechaSinTratamiento  : " + errorFechaSinTratamiento);
            
            wr.append("conti  : " + conti+"\n");
            wr.append("Registro con error por Fecha sin tratamiento  : " + errorFechaSinTratamiento+"\n"+"\n");

            System.out.println("total  : " + conTotalReg);

            System.out.println("Total Registros escritos en archivo .mrc  : " + totalGuardado);
            System.out.println("guardado  : " + guardado);
            
            wr.append("Total Registros escritos en archivo .mrc  : " + totalGuardado+"\n");
            wr.append("Leidos  : " + guardado+"\n"+"\n");
            
            wr.close();
            bw.close();
        } catch (IOException ex) {
            Logger.getLogger(IsisToMarc.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public static char[] Indicadores(String cadena) {
        //separo al 1er indicador 
        //En este caso " "
        char[] indicadores = new char[2];
        String indicador1 = cadena.substring(0, 1);
        if (indicador1.compareTo(" ") == 0 || indicador1.compareTo("#") == 0) {
            //        System.out.println("  -1er Indicador : Vacio");
            indicador1 = " ";
        } else {
            //      System.out.println("  -1er Indicador : "+indicador1);
        }
        indicadores[0] = indicador1.charAt(0);
        //separo al 2do indicador 
        //En este caso " "
        String indicador2 = cadena.substring(1, 2);
        if (indicador2.compareTo(" ") == 0 || indicador2.compareTo("#") == 0) {
            //    System.out.println("  -2do Indicador : Vacio");
            indicador2 = " ";
        } else {
          //  System.out.println("  -2er Indicador : "+indicador2);

        }
        indicadores[1] = indicador2.charAt(0);
        return indicadores;
    }

    public static void Subcampos(String cadena, DataField datafield, MarcFactory factory) {
        // Separo por el caracter: ^
        //1ro->"  "  
        //2do->"aCIRCO  "
        //3ro->"aDOMADOR"
        String[] subcampo = cadena.split("\\^");
        int cont = 1;

        while (cont < subcampo.length) {
            if (subcampo[cont].compareTo("") != 0) {
                String subcampoAux = subcampo[cont].substring(0, 1);
                //    System.out.println("    *Subcampo: "+subcampoAux+" : "+subcampo[cont].substring(1,subcampo[cont].length()));
                datafield.addSubfield(factory.newSubfield(subcampoAux.charAt(0), subcampo[cont].substring(1, subcampo[cont].length())));
            }
            cont++;
        }
    }
}
